perm filename X.FAI[TMP,LCS] blob sn#119574 filedate 1974-09-09 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE X
C00003 00003	RPG MODE:
C00010 00004	DOIT:	ANDCM C,BITTAB(D)
C00011 00005		ADDI A,1
C00012 00006	FRD:	MOVSI A,'PLX'
C00013 00007	GETNAM:	MOVEI A,
C00014 00008	XINI:	SKIPE RPGMOD
C00018 00009	XGPOUT:	SKIPGE XGSFLG
C00022 00010	FILNAM:	0
C00023 ENDMK
C⊗;
TITLE X

IFNDEF FOONLY{FOONLY←←-1}

A←1
B←2
C←3
D←4
E←5
L←6
U←7
PEN←10
X←11
Y←12
XD←13
T←15
TT←16
P←17

LPDL←←69

DSK←←1
XGP←←2

LMAR←←=0
RMAR←←=1699
WIDTH←←RMAR-LMAR+1
LBUFL←←<WIDTH+43>/44
LSTBIT←←1⊗<LBUFL*44-WIDTH>
OVERLAP←←=50			;OVERLAP 1/4 INCH
BOTTOM←←=50			;SHIFT BOTTOM UP 1/4 INCH

IFN FOONLY,<DOFF←←=200			;NUMBER OF STEPS TO WHERE P STARTS>
IFE FOONLY,<DOFF←←-(LMAR+RMAR+1)/2>

NBUFS←←4

EXTERN JOBREL,JOBFF

MAILBF:	BLOCK 40

SIGN:	0
LINE:	0
PNTR:	0
;RPG MODE:
;REGISTER	CONTENTS
;	0	FILENAME
;	1	FILEXT,,SPOOL FLAG
;	2	FILPPN
;	3	MAX X,,MIN X	IN PLOTTER STEPS ALONG PAPER
;	4	MAX Y,,MIN Y	IN PLOTTER STEPS ACROSS PAPER
;	5	GETLIN DONE FROM PLOT PROG

COMMENT ⊗
 MINX IS THE DISTANCE FROM THE LEFT EDGE OF THE DRAWING TO THE ORIGIN
 MAXX IS THE DISTANCE FROM THE RIGHT EDGE OF THE DRAWING TO THE ORIGIN
 MINY IS THE DISTANCE FROM THE BOTTOM EDGE OF THE DRAWING TO THE ORIGIN
 MAXY IS THE DISTANCE FROM THE TOP EDGE OF THE DRAWING TO THE ORIGIN
⊗

BEG:	JRST NORPG	;NORMAL STARTUP
	SETOM RPGMOD
	MOVEM 0,FILNAM
	MOVEM 0,XGSNAM
	HLLZM 1,FILEXT
	HRLZM 1,XGSFLG#
	MOVSI 1,'XG0'
	MOVEM 1,XGSEXT
	MOVEM 2,FILPPN
	MOVEM 2,XGSPPN
	MOVEM 3,RPGX#
	MOVEM 4,RPGY#
	MOVEM 5,LINE
	OUTSTR[ASCIZ/WELCOME TO X!
/]
	MOVE 1,['[PLX] ']
	MOVE P,[-LPDL,,PDL-1]
	PUSHJ P,DETCHK		;CHANGE OUR NAME IF DETACHED
	SETNAM 1,
	JRST MERGE
NORPG:	SETZM RPGMOD#
	SETOM LINE
	GETLIN LINE		;FOR ERROR PRINTOUT
MERGE:	CALLI
	HRRZS LINE		;CLEAR LINE BITS
	MOVE P,[-LPDL,,PDL-1]
	SKIPE RPGMOD
	JRST YCHECK		;ALREADY HAVE FILENAME
FILIN:	OUTSTR [ASCIZ /FILE?/]
	PUSHJ P,FRD
YCHECK:	SKIPE RPGMOD
	JRST [	HRRE A,RPGY	;GET SMALL Y PASSED TO US
		SUBI A,BOTTOM	;FUDGE UP
		JRST YDEF]	;AND START THERE
YAGAIN:
	OUTSTR [ASCIZ/
PLOT SLICE? (0 OR <CR> FOR SINGLE PAGE PLOTS) /]
	SETZ A,
	PUSHJ P,RNUM
	JRST YAGN1
	JUMPL A,YAGAIN
	CAIE C,12
	JRST YAGAIN
	IMUL A,[-WIDTH+OVERLAP]
YAGN1:	ADD A,[-BOTTOM]
	MOVE B,A

IFN FOONLY,<OUTSTR [ASCIZ/ORIGIN Y OFFSET FROM BOTTOM (DEFAULT IS -1)?/]>
IFE FOONLY,<OUTSTR [ASCIZ/ORIGIN Y OFFSET FROM BOTTOM (DEFAULT IS 4)?/]>
	PUSHJ P,RNUM
	JRST [	MOVE A,[DOFF]
		JRST YDEF]
	IMULI A,=100
	CAIN C,"."		;DECIMAL POINT?
	JRST [	INCHWL C
		CAIN C,15
		INCHWL C
		CAIL C,"0"
		CAILE C,"9"
		JRST .+1
		SUBI C,60
		IMULI C,=10
		SKIPE SIGN
		MOVN C,C
		ADD A,C
		PUSH P,A
		PUSHJ P,RNUM	;JUST GOBBLE THE REST
		JFCL
		POP P,A
		JRST .+1]
	MOVN A,A
	LSH A,1			;*2 (MAKE IT STEPS)
YDEFP:	CAIE C,12
	JRST [	CLRBFI
		JRST YAGAIN]
YDEF:	SKIPN RPGMOD
	ADD A,B
	MOVNM A,INIX#
AGAIN:	MOVE A,[FILNAM,,LKENT]
	BLT A,LKENT+3
	OPEN DSK,[14↔'DSK   '↔IBUF]
	JRST 4,.
	INBUF DSK,NBUFS
	LOOKUP DSK,LKENT
	JRST FNF
ASKLEN:	PUSHJ P,XINI
	JRST CORLUZ
OUTER:	IN DSK,
	JRST INOK
	STATO DSK,20000
	JRST 4,.
	RELEAS DSK,
IFN LSTBIT-1,<PUSHJ P,XFIX>
	JRST XGPOUT

INOK:	MOVN E,IBUF+2
	MOVSI E,(E)
	HRR E,IBUF+1
MAIN:	MOVE C,1(E)
	JFFO C,DOIT
	AOBJN E,MAIN
	JRST OUTER

FNF:	PUSHJ P,DETCHK
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ /LOOKUP FAILED.
/
	SKIPGE DET
	CALLI 12
	SETZM RPGMOD
	JRST FILIN

CORLUZ:	MOVE T,TT
	LSH T,-12
	PUSH P,T
	PUSHJ P,DETCHK
	PUSHJ P,XERR
	POP P,T
	PUSHJ P,DECOUT
	PUSHJ P,ERRPNT
	ASCIZ / K OF CORE NEEDED!
/
	SKIPGE DET
	CALLI 12
	SETZM RPGMOD
	JRST ASKLEN

LOSE:	PUSHJ P,DETCHK
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ /POINT OUT OF BOUNDS, /
	CAIGE Y,(L)
	JRST [	PUSHJ P,ERRPNT
		ASCIZ/-X/
		JRST LOSE1]
	PUSHJ P,ERRPNT
	ASCIZ/+X/
LOSE1:	PUSHJ P,ERRPNT
	ASCIZ/, TRY AGAIN!
/
	PUSHJ P,CORDWN
	SKIPGE DET
	CALLI 12
	SETZM RPGMOD
	JRST AGAIN

DECOUT:	IDIVI T,=10
	HRLM TT,(P)
	SKIPE T
	PUSHJ P,DECOUT
	HLRZ TT,(P)
	ADDI TT,60
	ROT TT,-7
	MOVEM TT,.+2
	PUSHJ P,ERRPNT
	0
	POPJ P,

ERRPNT:	HRRZ TT,(P)
	MOVEM TT,PNTR
	MOVEI TT,LINE
	TTYMES TT,
	JRST [	OUTSTR[ASCIZ/TTYMES FAILED	/]
		OUTSTR @PNTR
		OUTSTR[ASCIZ/
/]
		JRST .+1]
	POP P,TT
	HRL TT,(TT)
	TLNE TT,376
	AOJA TT,.-2
	JRST 1(TT)

XERR:	PUSHJ P,ERRPNT
	ASCIZ/
MESSAGE FROM X WORKING ON /
	MOVE TT,FILNAM
	PUSHJ P,SIXOUT
	PUSHJ P,ERRPNT
	ASCIZ/./
	HLLZ TT,FILEXT
	PUSHJ P,SIXOUT
	PUSHJ P,ERRPNT
	ASCIZ/[/
	MOVE TT,FILPPN
	PUSHJ P,SIXOUT
	PUSHJ P,ERRPNT
	ASCIZ/] : /
	POPJ P,

SIXOUT:	JUMPE TT,CPOPJ
	SETZ T,
	LSHC T,6
	ADDI T,40
	PUSH P,TT
	ROT T,-7
	MOVEM T,.+2
	PUSHJ P,ERRPNT
	0
	POP P,TT
	JRST SIXOUT

DETCHK:	SETOM DET#
	GETLIN DET
	HRRES DET
	SKIPL DET
	AOS (P)
	POPJ P,
DOIT:	ANDCM C,BITTAB(D)
	XCT MOVI1(D)
	XCT MOVI2(D)
DOI3:	XCT MOVI3(D)
DOPEN:	XCT PEN
	IORM B,@X
DONXT:	JFFO C,DOIT
	AOBJN E,MAIN
	JRST OUTER

MOVI1:	REPEAT 6,{
	HRLI PEN,(<CAIA>)
	HRLI PEN,(<TDNN C,(D)>)
	JUMPGE B,DOI3
	ROT B,-1
	SUBI Y,LBUFL+1
	ADDI Y,LBUFL+1
}
MOVI2:	REPEAT 6,{
	JRST DONXT
	JRST DONXT
	XCT XMOVL(X)
	JUMPGE B,DOPEN
	CAIGE Y,(L)
	CAIL Y,-LBUFL-1(U)
}
MOVI3:	REPEAT 6,{
	JRST 4,.
	JRST 4,.
	ROT B,1
	XCT XMOVR(X)
	JRST LOSE
	JRST LOSE
}
	ADDI A,1
XMOVL:	HRLOI X,XD
	REPEAT LBUFL-1,<SUBI X,1>
	SOJL A,.+1
	MOVE X,[Y,,LBUFL-1]
	AOJA A,DOI3

	SOJL A,XONR
XMOVR:	REPEAT LBUFL-1,<ADDI X,1>
	MOVE X,[XD,,LBUFL]
	ADDI A,1

XONR:	MOVSI X,Y
	AOJA A,DOPEN
FRD:	MOVSI A,'PLX'
	MOVEM A,FILEXT
	PUSHJ P,GETNAM
	JUMPE A,.+2
	MOVEM A,FILNAM
	CAIE C,"."
	JRST NOEXT
	PUSHJ P,GETNAM
	MOVEM A,FILEXT
NOEXT:	CAIE C,"["
	JRST FRDX
	PUSHJ P,GETP
	HRLZM A,FILPPN
	PUSHJ P,GETP
	HRRM A,FILPPN
FRDX:	INCHRW C
	CAIE C,12
	JRST FRDX
	POPJ P,

RNUM:	INCHWL C
	CAIN C,15
	JRST RNUM
	CAIN C,12
	POPJ P,
	AOS (P)
	MOVEI A,
	SETZM SIGN
	CAIN C,"-"
	JRST [	PUSHJ P,RNUML
		SETOM SIGN
		MOVN A,A
		POPJ P,]
	CAIN C,"+"
RNUML:	INCHWL C
	CAIL C,"0"
	CAILE C,"9"
	JRST RNUMX
	IMULI A,12
	ADDI A,-"0"(C)
	JRST RNUML

RNUMX:	CAIN C,15
	INCHRW C
	POPJ P,
GETNAM:	MOVEI A,
	MOVE B,[440600,,A]
GETNML:	PUSHJ P,RCH
	POPJ P,
	SUBI C,40
	TLNE B,770000
	IDPB C,B
	JRST GETNML

GETP:	MOVEI A,
GETPL:	PUSHJ P,RCH
	POPJ P,
	TRNE A,770000
	JRST GETPL
	LSH A,6
	ADDI A,-40(C)
	JRST GETPL

RCH:	INCHWL C
	CAIN C,42
	JRST RCHQ
	CAIE C,11
	CAIN C," "
	JRST RCH
	CAIE C,"."
	CAIN C,","
	POPJ P,
	CAIE C,"["
	CAIN C,"]"
	POPJ P,
RCHQR:	CAIGE C,40
	POPJ P,
	CAIL C,"a"
	CAILE C,"z"
	CAIA
	SUBI C,40
	JRST POPJ1

RCHQ:	INCHWL C
	JRST RCHQR
XINI:	SKIPE RPGMOD
	JRST [	HLRE A,RPGX	;GET MAX X
		HRRE B,RPGX	;AND MIN X
		SUB A,B		;FIND DIF
		ADDI A,=100	;LEAVE 1/4 INCH MARGIN AT EACH END
		SUBI B,=50	;INCORPORATE 1/4 INCH INTO MIN X
		IMUL B,[-LBUFL-1]	;MAKE IT WORDS IN MEMORY
		MOVEM B,IYPOS#		;INITIAL Y POS
		JRST XDEF]
XINI1:	OUTSTR [ASCIZ /TOTAL LENGTH IN INCHES (X DIMENSION, DEFAULT = 11)?/]
	PUSHJ P,RNUM
	MOVEI A,=11		;ASSUME 11 INCHES
	JUMPLE A,[XINLER:CLRBFI
		JRST XINI1]
	CAIE C,12
	JRST XINLER
	IMULI A,=200
	PUSH P,A		;SAVE THIS
YINI1:	OUTSTR [ASCIZ \ORIGIN X OFFSET FROM LEFT END(DEFAULT IS 1/2 LENGTH)?\]
	PUSHJ P,RNUM
	JRST [	MOVE A,(P)
		ASH A,-1
		IMULI A,LBUFL+1
		JRST IYDEF]
	CAIE C,12
	JRST [	CLRBFI
		JRST YINI1]
	IMULI A,=200
	IMULI A,LBUFL+1
IYDEF:	MOVEM A,IYPOS
	POP P,A
XDEF:	MOVEM A,LINCNT#
	MOVEI B,-1(A)
	IMULI A,LBUFL+1
	MOVE T,JOBFF
	MOVEM T,XGPPTR
	SOS XGPPTR
	MOVEI T,2(A)		;2 EXTRA WORDS
	MOVNI TT,(T)
	ADD T,XGPPTR
	HRLM TT,XGPPTR
	MOVE TT,T
	CALLI T,11
	POPJ P,
	HRRZ L,XGPPTR
	MOVSI T,1(L)
	HRRI T,2(L)
	SETZM 1(L)
	MOVE U,JOBREL
	BLT T,(U)
	MOVE TT,[BYTE (12)4001,LMAR,LBUFL]
	MOVEM TT,1(L)		;FIRST ONE HAS MARK AND CUT WITH IT
	TLZ TT,400000		;DELETE MARK AND CUT
	MOVEI T,1+LBUFL+1(L)
XINL:	MOVEM TT,(T)
	ADDI T,LBUFL+1
	SOJG B,XINL
	MOVSI TT,400100
	MOVEM TT,(T)
	MOVE PEN,[CAIA BYTTAB]
	MOVE Y,IYPOS
	ADDI Y,2(L)
	MOVEI XD,DBUF+1
	SKIPL A,INIX		;WHERE DO WE START
	JRST MAYBON
	SUBI A,43
	IDIV A,[-44]
	HRLOI X,XD
	SOJA A,SETB

MAYBON:	ADDI A,43
	IDIVI A,44
	CAILE A,LBUFL
	JRST OFFRT
	MOVE X,A
	SETZ A,
	HRLI X,Y
	JRST SETB

OFFRT:	MOVE X,[XD,,LBUFL]
	SUBI A,LBUFL
SETB:	MOVE B,INIX
	IDIVI B,44
	MOVSI B,400000
	MOVN C,C
	ROT B,(C)
POPJ1:	AOS (P)
CPOPJ:	POPJ P,
XGPOUT:	SKIPGE XGSFLG
	JRST [	OPEN XGP,[17↔'DSK   '↔0]
		JRST DSKERR
		HLLZS XGSEXT
		SETZM XGSEXT+1
		MOVE A,XGSPPN
		ENTER XGP,XGSNAM
		JRST DSKERR
		MOVEM A,XGSPPN
		JRST OUTIT]
	OPEN XGP,[1017↔'XGP   '↔0]
	JRST NOXGP
	OUTSTR[ASCIZ/CRANKING XGP
/]
	LOCK
OUTIT:	OUT XGP,XGPPTR
	JRST OUTOK
DSKERR:	PUSHJ P,DETCHK
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ /XGP OUTPUT ERROR.
/
OUTOK:	UNLOCK
	RELEAS XGP,
	SKIPN RPGMOD
	JRST XMORE
	MOVSI A,1
	ADDM A,XGSEXT		;SETUP FOR NEXT PART OF XG.. FILE
	MOVN A,INIX
	ADDI A,WIDTH-OVERLAP	;MAKE SURE WE CAN TAPE IT
	HLRE B,RPGY		;GET MAX Y
	SUBI B,OVERLAP		;ACCOUNT FOR OVERLAP IN A
	CAMGE A,B		;HIGH ENOUGH YET?
	JRST [	OUTSTR[ASCIZ/GOING BACK FOR ANOTHER PASS
/]
		JRST YDEF]		;NO, MAKE ANOTHER PASS
XMORE:	PUSHJ P,CORDWN			;REALLY DONE, CORE DOWN
	PUSHJ P,DETCHK
	JRST DODEL			;DELETE AUTOMATICALLY IF DETACHED
	OUTSTR[ASCIZ/DELETE PLX FILE?/]
	INCHRW C
	CAIN C,15
	INCHRW C
	CAIE C,12
	OUTSTR[ASCIZ/
/]
	CAIE C,"Y"
	CAIN C,"y"
	CAIA
	JRST NODEL
DODEL:	MOVE A,[FILNAM,,LKENT]
	BLT A,LKENT+3
	INIT DSK,17
	'DSK   '
	0
	JRST [	SKIPGE DET
		PUSHJ P,XERR
		PUSHJ P,ERRPNT
		ASCIZ/COULDN'T GET DISK FOR DELETE!
/
		JRST NODEL]
	LOOKUP DSK,LKENT
	JRST [	SKIPGE DET
		PUSHJ P,XERR
		PUSHJ P,ERRPNT
		ASCIZ/LOOKUP FOR DELETE FAILED!
/
		JRST NODEL]
	MOVE A,FILPPN
	MOVEM A,LKENT+3
	SETZM LKENT
	RENAME DSK,LKENT
	CAIA
	JRST NODEL
	SKIPGE DET
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ/RENAME FOR DELETE FAILED!
/
NODEL:	RELEASE DSK,
	SKIPGE DET
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ/ALL DONE!
/
	CALLI 12		;LEAVE

NOXGP:	PUSHJ P,DETCHK
	PUSHJ P,XERR
	PUSHJ P,ERRPNT
	ASCIZ /XGP NOT AVAILABLE (I THOUGHT I WAS WAITING FOR IT)!
/
	POPJ P,

XGPPTR:	BLOCK 2

IFN LSTBIT-1,<
XFIX:	MOVE A,[LSTBIT-1]
	MOVE C,LINCNT
	HRRZ D,XGPPTR
XFIXL:	ANDCAM A,LBUFL-1+2(D)
	ADDI D,LBUFL+1
	SOJG C,XFIXL
	POPJ P,
>
CORDWN:	MOVE T,JOBFF
	SUBI T,1
	CALLI T,11
	JRST 4,.
	POPJ P,
FILNAM:	0
FILEXT:	0
	0
FILPPN:	0

LKENT:	BLOCK 4

XGSNAM:	0
XGSEXT:	0
	0
XGSPPN:	0

IBUF:	BLOCK 3

BITTAB:	FOR I←43,0,-1{1⊗I
}
BYTTAB:	FOR I←36,0,-6{REPEAT 6,{77⊗I}}

DBUF:	BLOCK LBUFL+2

PDL:	BLOCK LPDL

END BEG